import { cloneDeep } from 'lodash'
import { defineStore } from 'pinia'
import { hanleAreaMap } from '@/common/utils/common'

export interface SetPublicParams {
  data: any
  type: string
  hasObj?: string
  isTree?: string
  key?: string
}

export const mapBy: any = (list: Record<string, unknown>[], key: number | string) => {
  list.forEach((i: Record<string, unknown>) => {
    if (!mapBy.res) {
      mapBy.res = {}
    }
    mapBy.res[i[key] as any] = i
    if (i.children) {
      mapBy(i.children, key)
    }
  })
  return mapBy.res
}

// 处理标签树形结构
export function handleLabelData(data: any, newObj?: any, str?: any, color?: string) {
  for (let i = 0; i < data.length; i++) {
    let newStr = str
    if (newStr) {
      newStr += '/' + data[i].name
    } else {
      newStr = data[i].name
    }
    const newColor = color || data[i].color
    data[i].name = newStr
    newObj[data[i]._id] = { name: data[i].name, color: color || data[i].color, _id: data[i]._id }
    const options = cloneDeep(data[i].children)
    if (options && options.length > 0) {
      handleLabelData(options, newObj, newStr, newColor)
    }
  }
  return newObj
}

export interface PublicCache {
  userCache: any[] // 员工列表
  userCacheObj: any // 服务组id为key的数据
  groupCache: any[] // 服务组
  groupCacheObj: Record<string, unknown> // 服务组id为key的数据
  globalFieldCache: any[] // 全局字段
  globalFieldCacheObj: Record<string, unknown> // 全局字段id为key的数据
  ivrNavObj: Record<string, unknown> // ivr语音导航id为key的数据
}

export const commonStore = defineStore('common', {
  state: () => {
    return {
      publicCache: {
        userCache: [], // 员工列表
        userCacheObj: {}, // 员工id为key的数据
        userCacheEnable: [],
        userCacheObjEnable: {},
        groupCache: [], // 服务组
        groupCacheObj: {}, // 服务组id为key的数据
        userList: [],
        userListObj: {},
        globalFieldCache: [], // 全局字段
        globalFieldCacheObj: {}, // 全局字段field为key的数据
        dyForm: [], // 动态表单
        cusInfo: [], // 客户信息
        cusInfoObj: {}, // 客户信息
        region: [], // 地区
        areaMap: {}, // 地区
        voiceLibrary: [], // 语音库
        voiceLibraryObj: {}, // 语音库id为key的数据
        serveNum: [], //服务号
        ivrCache: [], //语音导航
        explicNum: [], //外显号
        sipNum: [], //sip号
        serviceTime: [], //服务时间
        ivrNav: [], //ivr导航
        ivrNavObj: {}, //ivr导航id为key的数据
        serviceLabels: [], // 服务标签
        serviceLabelsObj: {} // 服务标签_id为key的对象
      } as any
    }
  },
  actions: {
    setPublicCache(obj: SetPublicParams) {
      // groupCache 进行平铺
      if (['groupCache', 'serviceLabels'].includes(obj.type)) {
        // 服务组
        this.publicCache[obj.type] = obj.data
        this.publicCache[obj.type + 'Obj'] = mapBy(obj.data, '_id')
        return
      } else if (obj.type === 'region') {
        // 地区
        this.publicCache.region = obj.data.result
        this.publicCache.areaMap = hanleAreaMap(obj.data.result)
        return
      } else if (obj.type === 'ivrNav') {
        // ivr语音导航
        this.publicCache[obj.type] = obj.data
        this.publicCache[obj.type + 'Obj'] = mapBy(obj.data, 'id')
      }
      const enableType = ['userCache'] // 需要过滤
      const isEnable = enableType.includes(obj.type)
      // eslint-disable-next-line @typescript-eslint/no-this-alias
      const _this: any = this
      if (obj.hasObj) {
        const newObj: any = {}
        const enableArr: any[] = []
        if (!obj.data.length) {
          return
        }
        obj.data.forEach((item: any) => {
          newObj[item[obj.key || '_id']] = JSON.parse(JSON.stringify(item))
          if (isEnable && item.status === 1) {
            enableArr.push(item)
          }
          if (isEnable) {
            // 为座席增加name拼接，回显使用
            newObj[item._id] = {
              ...newObj[item._id],
              name: `${item.agentName} [${item.agentNumber}]`
            }
          }
        })
        if (isEnable) {
          // 过滤启用状态的数据
          _this.publicCache[obj.type + 'Enable'] = enableArr
        }
        _this.publicCache[obj.type + 'Obj'] = newObj // 以id为key的数据
      }
      if (obj.isTree && obj.data.tree) {
        let newObj: any = {}
        const treeData = obj.data.tree || []
        newObj = handleLabelData(treeData, {})
        _this.publicCache[obj.type + 'TreeObj'] = newObj
      }
      _this.publicCache[obj.type] = obj.data // 普通类型的所有数据
    }
  }
})
